package reflect;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;

/**
 * 获取一个类中的方法 Method
 */
public class ReflectDemo4 {
    public static void main(String[] args) throws Exception{
        //获取Person类中的方法
        Class cls = Class.forName("reflect.Person");

        /*
            Class提供了反应其表示的类的方法信息
            Method[] getMethods()
            Method getMethod(String name,Class...)

            Method类，也是反射对象之一
            它的每一个实例用于表示一个类中的某个方法
            通过Method对象可以反应出该方法的相关信息:
            访问修饰符，返回值类型，方法名，参数信息等
            可以通过方法对象执行这个方法
         */
        /**
         * 获取Method对象的方法：
         * 1.getMethod (String name, Class <?>... parameterTypes);// 见ReflectDemo5
         * 2.getMethods (); 获取的是类对象的所有公开的成员方法，含继承超类的
         *   通过for遍历输出getName(),这种方法还能显示出这些成员方法所继承的超类方法！！
         */
        Method[] methods = cls.getMethods();//注意这里是getMethods获取所有的公共成员方法
        for(Method method : methods) {
            System.out.println(method.getName());
        }
        //试试获取任意一个类的Method对象
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入类名");
        String className = scan.nextLine();
        Class cls1 = Class.forName(className);
        Method[] methods1 = cls1.getMethods();
        for(Method method1 : methods1) {
            System.out.println(method1);
            System.out.println("方法名："+method1.getName());
            //获取Method对象(方法)的参数个数
            int count = method1.getParameterCount();
            System.out.println("参数的个数是："+count);
            //获取该方法的访问修饰符
            int modifiers = method1.getModifiers();//public,private等等都有一个常量值，是十六进制的，所以用int接收
            switch (modifiers) {
                case Modifier.PUBLIC :
                    System.out.println("是公开方法");
                    break;
                case Modifier.PRIVATE :
                    System.out.println("是私有方法");
                    break;
                case Modifier.PROTECTED:
                    System.out.println("是受保护方法");
                    break;
            }
        }
    }
}
